package com.divemotor.ventarepuestosinternet.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.primefaces.context.RequestContext;
import org.primefaces.event.DateSelectEvent;
import org.primefaces.model.LazyDataModel;

import com.divemotor.ventarepuestosinternet.beans.CotizacionConEstadosBusquedaBean;
import com.divemotor.ventarepuestosinternet.beans.adapter.CotizacionAdapter;
import com.divemotor.ventarepuestosinternet.beans.adapter.ElementoCotizacionAdapter;
import com.divemotor.ventarepuestosinternet.beans.form.CotizacionBeanForm;
import com.divemotor.ventarepuestosinternet.beans.lazy.CotizacionSupervisorLazy;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Cotizacion;
import com.divemotor.ventarepuestosinternet.model.CotizacionConEstados;
import com.divemotor.ventarepuestosinternet.model.Departamento;
import com.divemotor.ventarepuestosinternet.model.Distrito;
import com.divemotor.ventarepuestosinternet.model.EstadoCotizacion;
import com.divemotor.ventarepuestosinternet.model.Provincia;
import com.divemotor.ventarepuestosinternet.model.SeguimientoEstadoCotizacion;
import com.divemotor.ventarepuestosinternet.model.Sucursal;
import com.divemotor.ventarepuestosinternet.model.Vendedor;
import com.divemotor.ventarepuestosinternet.service.CotizacionConEstadosService;
import com.divemotor.ventarepuestosinternet.service.CotizacionService;
import com.divemotor.ventarepuestosinternet.service.EstadoCotizacionService;
import com.divemotor.ventarepuestosinternet.service.SeguimientoCotizacionService;
import com.divemotor.ventarepuestosinternet.service.SucursalService;
import com.divemotor.ventarepuestosinternet.service.SupervisorService;
import com.divemotor.ventarepuestosinternet.service.VendedorService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.FacesContextUtil;

@ManagedBean (name="gestionCotizacionesSupervisorController")
@ViewScoped
public class GestionCotizacionesSupervisorController implements Serializable	{
	
	private static final Logger logger = Logger.getLogger(GestionCotizacionesSupervisorController.class);
	
	private static final long serialVersionUID = -1167264456791023786L;

	@ManagedProperty (value="#{cotizacionService}")
    private CotizacionService cotizacionService;
    @ManagedProperty (value="#{supervisorService}")
    private SupervisorService supervisorService;
    @ManagedProperty (value="#{sucursalService}")
    private SucursalService	 sucursalService;
    @ManagedProperty (value="#{estadoCotizacionService}")
    private EstadoCotizacionService estadoCotizacionService;
    @ManagedProperty (value = "#{vendedorService}")
    private VendedorService vendedorService;
    @ManagedProperty (value="#{seguimientoCotizacionService}")
    private SeguimientoCotizacionService seguimientoCotizacionService;
    @ManagedProperty (value="#{cotizacionConEstadosService}")
    private CotizacionConEstadosService cotizacionConEstadosService;
    @ManagedProperty(value="#{cabeceraSupervisor}")
	private String cabeceraSupervisor;
    @ManagedProperty(value="#{imgRuta}")
	private String imgRuta;
    
    private CotizacionBeanForm cotizacionBeanForm;
	private CotizacionAdapter cotizacionEditar; 
	private CotizacionAdapter cotizacionDetalle;
	private List<Cotizacion> listaCotizaciones;
	private List<Departamento> listaDepartamento;
    private List<Provincia> listaProvincias;
    private List<Distrito> listaDistritos;
    private List<Sucursal> listaSucursales;
    private List<EstadoCotizacion> listaEstadoCotizacion;
    private List<Vendedor> listaVendedoresSupervisor;
    private Date fechaMin;
    private Date fechaMax;
    private Date fechaSolictud;
    private LazyDataModel<CotizacionAdapter> listaLazyCotizaciones;
    private List<ElementoCotizacionAdapter> listaElementoCotizacionAdapter;
    private String observaciones;
    private String nombreVendedor;
    private List<SeguimientoEstadoCotizacion> listaHistorialEstados;
    private Date fechaPorAtender;
    private Date fechaAsignado;
    private Date fechaCotizado;
    private Date fechaPedido;
    private Date fechaFacturado;
    private Date fechaRechazado;
    private ElementoCotizacionAdapter elementoCotizacionDetalle;
    private CotizacionConEstadosBusquedaBean cotizacionConEstadosBusquedaBean;
    private List<CotizacionConEstados> listaCotizacionConEstados;
    
    public GestionCotizacionesSupervisorController() {
    	logger.info("GestionCotizacionesSupervisorController");
    	
	    cotizacionBeanForm				= new CotizacionBeanForm();
	    cotizacionEditar				= new CotizacionAdapter();
	    elementoCotizacionDetalle 		= new ElementoCotizacionAdapter();
	    cotizacionConEstadosBusquedaBean= new CotizacionConEstadosBusquedaBean();
	    listaCotizacionConEstados 		= new ArrayList<CotizacionConEstados>();
	}
    
	@PostConstruct
	void init(){
		logger.info("init");
	    buscarCotizaciones();
        listarDepartamentos();
        listarSucursales();
        listarEstadoCotizacion();
        listarVendedores();
	}

	public void listarVendedores() {
		try {
			listaVendedoresSupervisor = vendedorService.listarVendedoresPorSupervisorAutenticado();
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listarVendedores DivemotorBusinessException: " + e.getMessage());
		} catch (Exception e) {
			logger.error("EX* listarVendedores Exception: " + e.getMessage());
		}
	}

	public void listarDepartamentos() {
		try {
			 listaDepartamento = supervisorService.obtenerDepartamentosPorSupervisor();
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listarDepartamentos DivemotorBusinessException: " + e.getMessage());
		}
	}
	
	public void listarProvincias()  {
		try {
			 listaProvincias = supervisorService.obtenerProvinciasPorSupervisor(cotizacionBeanForm.getIdDepartamento());
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listarProvincias DivemotorBusinessException: " + e.getMessage());
		}
	}
	
	public void listarDistritos() {
		 try {
			 listaDistritos = supervisorService.obtenerDistritosPorSupervisor(cotizacionBeanForm.getIdProvincia());
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listardistritos DivemotorBusinessException: " + e.getMessage());
		}
	}
	
	private void listarSucursales() {
		try {
			listaSucursales = supervisorService.obtenerListaSucursales(DatosDeSession.obtenerUsuarioAutenticado());
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listarSucursales: " + e.getMessage());
		}
	}
	
	public void actualizarBeanBusquedaCotizacionConEstados() {
		cotizacionConEstadosBusquedaBean.setFechaInicio(cotizacionBeanForm.getFechaInicio());
		cotizacionConEstadosBusquedaBean.setFechaFin(cotizacionBeanForm.getFechaFin());
		CotizacionConEstados cotiEstado = cotizacionConEstadosBusquedaBean.getCotizacionConEstados();
		cotiEstado.setIdDepartamento(cotizacionBeanForm.getIdDepartamento());
		cotiEstado.setIdProvincia(cotizacionBeanForm.getIdProvincia());
		cotiEstado.setIdDistrito(cotizacionBeanForm.getIdDistrito());
		cotiEstado.setIdSucursal(cotizacionBeanForm.getIdSucursal());
		cotiEstado.setIdEstadoCotizacion(cotizacionBeanForm.getIdEstadoCotizacion());
		cotiEstado.setIdVendedor(cotizacionBeanForm.getIdVendedor());
		
		if (Constantes.EMPTY.equals(cotizacionBeanForm.getNumSolicitud())) {
			cotizacionConEstadosBusquedaBean.getCotizacionConEstados().setIdCotizacion(Constantes.NO_SELECCIONADO);
		} else {
			cotizacionConEstadosBusquedaBean.getCotizacionConEstados().setIdCotizacion(Integer.valueOf(cotizacionBeanForm.getNumSolicitud()));
		}
		listaCotizacionConEstados = new ArrayList<CotizacionConEstados>();
	}
	
	public void exportarResultadosCotizacion() {
		try {
			listaCotizacionConEstados = cotizacionConEstadosService.buscar(cotizacionConEstadosBusquedaBean);
		} catch (DivemotorBusinessException e) {
			logger.error("EX* exportarResultadosCotizacion DivemotorBusinessException: " + e.getMessage());
		} catch (Exception e) {
			logger.error("EX* exportarResultadosCotizacion Exception: " + e.getMessage());
		}
	}

	public void postProcessXLS(Object document) {
		HSSFWorkbook wb = (HSSFWorkbook) document;
		HSSFSheet sheet = wb.getSheetAt(0);
		HSSFRow header = sheet.getRow(0);
		
		HSSFFont font = wb.createFont();
		font.setFontHeightInPoints((short)10);
		font.setFontName(HSSFFont.FONT_ARIAL);
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
		font.setColor(HSSFColor.WHITE.index);
		
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
		cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
		cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		cellStyle.setFont(font);
		
		Row row = sheet.getRow(0);
		String[] cabecera = cabeceraSupervisor.split(Constantes.COMA);
		for(int i=0; i < header.getPhysicalNumberOfCells(); i++) {
			Cell cell = row.getCell(i); 
			cell.setCellValue(cabecera[i]);
			header.getCell(i).setCellStyle(cellStyle);
			sheet.autoSizeColumn((short)i);
		}
	}
	
	public void buscarCotizaciones() {
		logger.info("buscarCotizaciones");
		listaLazyCotizaciones = new CotizacionSupervisorLazy(cotizacionService, cotizacionBeanForm, cotizacionConEstadosBusquedaBean);
		actualizarBeanBusquedaCotizacionConEstados();
		listaCotizacionConEstados = new ArrayList<CotizacionConEstados>();
	}

	private void listarEstadoCotizacion() {
		try {
			listaEstadoCotizacion = cotizacionService.obtenerEstadosCotizacionPorUsuarioSucursal(DatosDeSession.obtenerUsuarioAutenticado());
		} catch (DivemotorBusinessException e) {
			logger.error("EX* listarEstadoCotizacion: " + e.getMessage());
		}
	}
	
	public void cargarDatosCotizacion(CotizacionAdapter cotizacion){
		cotizacionEditar = cotizacion;
 		listarElementoCotizacionAdapter(cotizacionEditar.getIdCotizacion());
	}
	
	private void listarElementoCotizacionAdapter(Integer idCotizacion){
		logger.info("listarElementoCotizacion");
		try {
			listaElementoCotizacionAdapter = cotizacionService.obtenerDetalleCotizacionAdapter(idCotizacion);
		} catch (Exception e) {
			logger.error("EX* listarElementoCotizacion: " + e.getMessage());
		}
	}
	
	public void cargarDetalleRepuesto(ElementoCotizacionAdapter elemento){
		logger.info("cargarDetalleRepuesto");
		try {
			elementoCotizacionDetalle = elemento;
			
			List<ElementoCotizacionAdapter> lista = cotizacionService.obtenerDetalleRepuesto(elemento.getIdCotizacion());
			if(CollectionUtils.isEmpty(lista)){
				elementoCotizacionDetalle.crearImagenRepuestoDefault();
			}else{
				ElementoCotizacionAdapter elem = lista.get(0);
				elementoCotizacionDetalle.setImagenRepuesto(elem.getImagenRepuesto());
			}
		} catch (Exception e) {
			logger.error("EX* listarElementoCotizacion: " + e.getMessage());
		}
	}
	
	public void cargarDetallePromocion(ElementoCotizacionAdapter elemento){
		logger.info("cargarDetalleRepuesto");
		try {
			elementoCotizacionDetalle = elemento;
			
			List<ElementoCotizacionAdapter> lista = cotizacionService.obtenerDetallePromocion(elemento.getIdCotizacion());
			if(CollectionUtils.isEmpty(lista)){
				elementoCotizacionDetalle.crearPromocionDefault();
			}else{
				ElementoCotizacionAdapter elem = lista.get(0);
				elementoCotizacionDetalle.setPromocion(elem.getPromocion());
			}
		} catch (Exception e) {
			logger.error("EX* listarElementoCotizacion: " + e.getMessage());
		}
	}

	public void seleccionarEstadoCotizacionEditar() {
		if (Constantes.ID_ESTADO_COTIZACION_POR_ATENDER.equals(cotizacionBeanForm.getIdEstadoCotizacion())) {
			cotizacionBeanForm.setIdVendedor(Constantes.NO_SELECCIONADO);
		}
	}
	
	public void actualizarContizacion() {
	   	try {
	   		//TODO VALIDAR EL INGRESO DE TODOS LOS DATOS
			cotizacionService.actualizar(cotizacionEditar.getIdCotizacion(),
										 cotizacionEditar.getIdEstadoCotizacion(),
										 cotizacionEditar.getIdVendedor(),
										 cotizacionEditar.getObservacion());
			buscarCotizaciones();
			FacesContextUtil.info(Constantes.TITULO_MENSAJE, Constantes.COTIZACION_ACTUALIZACION_OK);
		} catch (DivemotorBusinessException e) {
			logger.error("EX* actualizarContizacion DivemotorBusinessException: " + e.getMessage());
			RequestContext.getCurrentInstance(). addCallbackParam("ocurrioError", true);
			FacesContextUtil.warn(e.getMessage());
	    } catch (Exception e) {
	    	logger.error("EX* actualizarContizacion Exception: " + e.getMessage());
			RequestContext.getCurrentInstance().addCallbackParam("ocurrioError", true);
			FacesContextUtil.error(Constantes.TITULO_MENSAJE,Constantes.MSJ_ERROR_SISTEMA);
	  }
	}
	
	public void cargarHistorialEstados(CotizacionAdapter cotizacion){
		logger.info("cargarHistorialEstados");
		
		cotizacionDetalle = cotizacion;
		nombreVendedor 	  = cotizacionDetalle.getNombreVendedor();
		
	    try {	 
	    	listaHistorialEstados = seguimientoCotizacionService.listarPorIdCotizacion(cotizacionDetalle.getIdCotizacion());

	    	fechaPorAtender 	= null;
		    fechaAsignado 		= null;
		    fechaCotizado 		= null;
		    fechaPedido 		= null;
		    fechaFacturado 		= null;
		    fechaRechazado 		= null;
		     
		    for (SeguimientoEstadoCotizacion estadoCoti : listaHistorialEstados) {
		    	Integer idEstado = estadoCoti.getEstadoCotizacion().getIdEstadoCotizacion();
		    	Date fecha = estadoCoti.getFechaCambio();
		    	
		    	switch (idEstado) {
					case 1:	fechaPorAtender = fecha;
							break;
		
					case 2: fechaAsignado   = fecha;
							break;
							
					case 3: fechaCotizado   = fecha;
							break;
							
					case 4: fechaPedido     = fecha;
							break;
						
					case 5: fechaFacturado  = fecha;
							break;
						
					case 6: fechaRechazado  = fecha;
							break;
		    	}
			} 
	    } catch (Exception e) {
     		logger.error("EX* cargarHistorialEstados Exception: " + e.getMessage());
	    }
	}
	
	public void limpiarBuscar(){
         cotizacionBeanForm.limpiarForm();
	}
	
	public List<Cotizacion> getListaCotizaciones() {
		return listaCotizaciones;
	}

	public void setListaCotizaciones(List<Cotizacion> listaCotizaciones) {
		this.listaCotizaciones = listaCotizaciones;
	}

	public void setCotizacionService(CotizacionService cotizacionService) {
		this.cotizacionService = cotizacionService;
	}

	public CotizacionAdapter getCotizacionEditar() {
		return cotizacionEditar;
	}

	public void setCotizacionEditar(CotizacionAdapter cotizacionEditar) {
		this.cotizacionEditar = cotizacionEditar;
	}

	public CotizacionAdapter getCotizacionDetalle() {
		return cotizacionDetalle;
	}

	public void setCotizacionDetalle(CotizacionAdapter cotizacionDetalle) {
		this.cotizacionDetalle = cotizacionDetalle;
	}

	public List<Provincia> getListaProvincias() {
		return listaProvincias;
	}

	public void setListaProvincias(List<Provincia> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	public List<Distrito> getListaDistritos() {
		return listaDistritos;
	}

	public void setListaDistritos(List<Distrito> listaDistritos) {
		this.listaDistritos = listaDistritos;
	}

	public List<Departamento> getListaDepartamento() {
		return listaDepartamento;
	}

	public void setListaDepartamento(List<Departamento> listaDepartamento) {
		this.listaDepartamento = listaDepartamento;
	}

	public void setSupervisorService(SupervisorService supervisorService) {
		this.supervisorService = supervisorService;
	}

	public List<Sucursal> getListaSucursales() {
		return listaSucursales;
	}

	public void setListaSucursales(List<Sucursal> listaSucursales) {
		this.listaSucursales = listaSucursales;
	}

	public List<Vendedor> getListaVendedoresSupervisor() {
		return listaVendedoresSupervisor;
	}

	public void setListaVendedoresSupervisor(List<Vendedor> listaVendedoresSupervisor) {
		this.listaVendedoresSupervisor = listaVendedoresSupervisor;
	}

	public SucursalService getSucursalService() {
		return sucursalService;
	}

	public void setSucursalService(SucursalService sucursalService) {
		this.sucursalService = sucursalService;
	}

	public List<EstadoCotizacion> getListaEstadoCotizacion() {
		return listaEstadoCotizacion;
	}

	public void setListaEstadoCotizacion(List<EstadoCotizacion> listaEstadoCotizacion) {
		this.listaEstadoCotizacion = listaEstadoCotizacion;
	}

	public Date getFechaMin() {
		return fechaMin;
	}

	public void setFechaMin(Date fechaMin) {
		this.fechaMin = fechaMin;
	}

	public Date getFechaMax() {
		return fechaMax;
	}

	public void setFechaMax(Date fechaMax) {
		this.fechaMax = fechaMax;
	}

	public LazyDataModel<CotizacionAdapter> getListaLazyCotizaciones() {
		return listaLazyCotizaciones;
	}

	public void setListaLazyCotizaciones(LazyDataModel<CotizacionAdapter> lisLazyCotizaciones) {
		this.listaLazyCotizaciones = lisLazyCotizaciones;
	}

	public Date getFechaSolictud() {
		return fechaSolictud;
	}

	public void setFechaSolictud(Date fechaSolictud) {
		this.fechaSolictud = fechaSolictud;
	}

	public void setEstadoCotizacionService(EstadoCotizacionService estadoCotizacionService) {
		this.estadoCotizacionService = estadoCotizacionService;
	}

	public void setVendedorService(VendedorService vendedorService) {
		this.vendedorService = vendedorService;
	}

	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	public String getNombreVendedor() {
		return nombreVendedor;
	}

	public void setNombreVendedor(String nombreVendedor) {
		this.nombreVendedor = nombreVendedor;
	}

	public Date getFechaPorAtender() {
		return fechaPorAtender;
	}

	public void setFechaPorAtender(Date fechaPorAtender) {
		this.fechaPorAtender = fechaPorAtender;
	}

	public Date getFechaAsignado() {
		return fechaAsignado;
	}

	public void setFechaAsignado(Date fechaAsignado) {
		this.fechaAsignado = fechaAsignado;
	}

	public Date getFechaCotizado() {
		return fechaCotizado;
	}

	public void setFechaCotizado(Date fechaCotizado) {
		this.fechaCotizado = fechaCotizado;
	}

	public Date getFechaPedido() {
		return fechaPedido;
	}

	public void setFechaPedido(Date fechaPedido) {
		this.fechaPedido = fechaPedido;
	}

	public Date getFechaFacturado() {
		return fechaFacturado;
	}

	public void setFechaFacturado(Date fechaFacturado) {
		this.fechaFacturado = fechaFacturado;
	}

	public Date getFechaRechazado() {
		return fechaRechazado;
	}

	public void setFechaRechazado(Date fechaRechazado) {
		this.fechaRechazado = fechaRechazado;
	}

	public List<SeguimientoEstadoCotizacion> getListaHistorialEstados() {
		return listaHistorialEstados;
	}

	public void setListaHistorialEstados(List<SeguimientoEstadoCotizacion> listaHistorialEstados) {
		this.listaHistorialEstados = listaHistorialEstados;
	}

	public void setSeguimientoCotizacionService(SeguimientoCotizacionService seguimientoCotizacionService) {
		this.seguimientoCotizacionService = seguimientoCotizacionService;
	}

	public ElementoCotizacionAdapter getElementoCotizacionDetalle() {
		return elementoCotizacionDetalle;
	}

	public void setElementoCotizacionDetalle(ElementoCotizacionAdapter elementoCotizacionDetalle) {
		this.elementoCotizacionDetalle = elementoCotizacionDetalle;
	}

	public List<CotizacionConEstados> getListaCotizacionConEstados() {
		return listaCotizacionConEstados;
	}

	public void setListaCotizacionConEstados(List<CotizacionConEstados> listaCotizacionConEstados) {
		this.listaCotizacionConEstados = listaCotizacionConEstados;
	}

	public CotizacionConEstadosBusquedaBean getCotizacionConEstadosBusquedaBean() {
		return cotizacionConEstadosBusquedaBean;
	}

	public void setCotizacionConEstadosBusquedaBean(CotizacionConEstadosBusquedaBean cotizacionConEstadosBusquedaBean) {
		this.cotizacionConEstadosBusquedaBean = cotizacionConEstadosBusquedaBean;
	}

	public void setCotizacionConEstadosService(CotizacionConEstadosService cotizacionConEstadosService) {
		this.cotizacionConEstadosService = cotizacionConEstadosService;
	}
   
	public void setMaxFecha(DateSelectEvent event){
		this.fechaMax = event.getDate();
	}
	
	public void setMinFecha(DateSelectEvent event){
		this.fechaMin = event.getDate();
	}
	
	public List<ElementoCotizacionAdapter> getListaElementoCotizacionAdapter() {
		return listaElementoCotizacionAdapter;
	}

	public void setListaElementoCotizacionAdapter(List<ElementoCotizacionAdapter> listaElementoCotizacionAdapter) {
		this.listaElementoCotizacionAdapter = listaElementoCotizacionAdapter;
	}

	public CotizacionBeanForm getCotizacionBeanForm() {
		return cotizacionBeanForm;
	}

	public void setCotizacionBeanForm(CotizacionBeanForm cotizacionBeanForm) {
		this.cotizacionBeanForm = cotizacionBeanForm;
	}

	public void setCabeceraSupervisor(String cabeceraSupervisor) {
		this.cabeceraSupervisor = cabeceraSupervisor;
	}

	public void setImgRuta(String imgRuta) {
		this.imgRuta = imgRuta;
	}
	
}
